package org.wupgateway.utils;


import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;

public class JWTTokenUtil {
	public static final String SECRET_KEY = "HK4aDkYxmdYG4ZbwrjnCKJNGNTtAGR7H7xC4fTXzy4GWHSTxcj3FnbkMmNQSTMbSrnJm5dSeWXxeQvRfKe7jty8sG7fHzBrmTDp5fjYMjTNRzM7KN7Xc5uHSVDUWDfEhhFFZZp8UVp654yfbdBr6KzdS5p8Ut8yYCfFErAMKxVUt7VxKG2QsXYkRFBZ2hxTFUMTa87ftcundbbCGta2C4AcZCQfAtBat7YJDfpWw3szjwef4ENadMAQbWkszNA82";
	
	public static final SecretKey KEY = Keys.hmacShaKeyFor(SECRET_KEY.getBytes(StandardCharsets.UTF_8));
	// token保质期为30天
	private static final long EXPIRATION_TIME = 7 * 1000 * 60 * 60 * 24;
	
	/**
	 * 生成JWT令牌的方法
	 *
	 * @param body JWT的载荷部分内容
	 *
	 * @return 返回生成的JWT令牌字符串
	 */
	public static String getToken(
		String body) {  // 参数：JWT的载荷内容
		
		return Jwts.builder()   // 创建JWT构建器
		           .subject(body)    // 设置JWT的主题(subject)
		           .signWith(KEY)     // 使用密钥KEY进行签名
		           .compact();        // 生成紧凑的JWT字符串
	}
	
	
	/**
	 * 验证JWT令牌的有效性
	 *
	 * @param token 待验证的JWT令牌字符串
	 * @param body  需要与令牌中subject比较的字符串
	 *
	 * @return 验证成功返回true，失败返回false
	 */
	public static Boolean validateToken(
		String token,
		// 待验证的JWT令牌字符串
		String body) {      // 需要与令牌中subject比较的字符串
		try {
			// 使用密钥解析并验证传入的JWT令牌
			String result = Jwts
				.parser()
				.verifyWith(KEY)    // 设置用于验证签名的密钥
				.build()            // 构建解析器
				.parseSignedClaims(token)  // 解析并验证签名后的声明
				.getBody()          // 获取声明主体
				.getSubject();
			// 从Redis中获取存储的令牌并解析
			String localToken = JedisUtils.get(body);
			localToken = Jwts
				.parser()
				.verifyWith(KEY)
				.build()
				.parseClaimsJws(localToken)
				.getBody()
				.getSubject();
			// 比较两个令牌的subject是否一致
			if (result.equals(localToken)) {
				return true;
			}
			return false;
		}
		catch (JwtException e) {
			// 如果发生JWT相关异常，返回验证失败
			return false;
		}
	}
}